home *** CD-ROM | disk | FTP | other *** search
- IFND DEVICES_I
- DEVICES_I = 1
- ;*---------------------------------------------------------------------------
- ; :Author. Bert Jahn
- ; :Contens. macros for processing devices
- ; :EMail. wepl@kagi.com
- ; :Address. Franz-Liszt-Straße 16, Rudolstadt, 07404, Germany
- ; :Version. $Id: devices.i 1.2 1998/12/06 13:40:53 jah Exp $
- ; :History. 29.12.95 separated from WRip.asm
- ; 18.01.96 IFD Label replaced by IFD Symbol
- ; because Barfly optimize problems
- ; :Copyright. © 1995,1996,1997,1998 Bert Jahn, All Rights Reserved
- ; :Language. 68000 Assembler
- ; :Translator. Barfly V1.130
- ;---------------------------------------------------------------------------*
- *##
- *## devices.i
- *##
- *## _GetDeviceInfo devicename(a0) infostruct(a1) -> success(d0)
- *## _deviceerrors device error strings
- *## _trackdiskerrors trackdisk.device error strings
-
- dc.b "$Id: devices.i 1.2 1998/12/06 13:40:53 jah Exp $"
- EVEN
-
- IFND DOS_DOSEXTENS_I
- INCLUDE dos/dosextens.i
- ENDC
- IFND DOS_FILEHANDLER_I
- INCLUDE dos/filehandler.i
- ENDC
- IFND STRINGS_I
- INCLUDE strings.i
- ENDC
- IFND _LVOLockDosList
- INCLUDE lvo/dos.i
- ENDC
-
- ;----------------------------------------
- ; Besorgt Infos über Device
- ; references: The Amiga Guru Book, Ralph Babel
- ; S.618f ACTION_GET_DISK_FSSM
- ; S.551ff DosList structure
- ; S.353ff DOS-internals and programming aspects
- ; Übergabe : A0 = CPTR name of device without ":" (e.g. "DF1")
- ; A1 = STRUCT DeviceInfo to fill
- ; Rückgabe : D0 = LONG success
- ; Benötigt : _PrintErrorDOS (a0 = CPTR name of error | NIL)
- ; _PrintError (d0 = CPTR Subsystem | NIL
- ; a0 = CPTR Art des Fehlers | NIL
- ; a1 = CPTR bei Operation | NIL)
-
- DEVNAMELEN = 64 ;maximal length of the device name
-
- STRUCTURE DeviceInfo,0
- STRUCT devi_Device,DEVNAMELEN
- ULONG devi_Unit
- ULONG devi_DeviceFlags
- ULONG devi_SizeBlock ;in Bytes !
- ULONG devi_Surfaces
- ULONG devi_SectorPerBlock
- ULONG devi_BlocksPerTrack
- ULONG devi_LowCyl
- ULONG devi_HighCyl
- LABEL devi_SIZEOF
-
- GetDeviceInfo MACRO
- IFND GETDEVICEINFO
- GETDEVICEINFO = 1
- IFND COPYSTRING
- CopyString
- ENDC
-
- DOSLISTFLAGS = LDF_READ!LDF_DEVICES ;flags for LockDosList,FindDosEntry,UnLockDosList
-
- _GetDeviceInfo movem.l d2-d7/a2/a6,-(a7)
- move.l a0,d2 ;D2 = DevName
- move.l a1,a2 ;A2 = STRUCT DeviceInfo
- moveq #-1,d7 ;D7 = ReturnCode (bool)
-
- moveq #DOSLISTFLAGS,d1
- move.l (gl_dosbase,GL),a6
- jsr (_LVOLockDosList,a6)
- move.l d0,d1 ;D1 = doslist
- bne .dlok
- lea (_getdevinfo),a0
- bsr _PrintErrorDOS
- moveq #0,d7
- bra .nodl
- .dlok ;D2 = name
- moveq #DOSLISTFLAGS,d3
- jsr (_LVOFindDosEntry,a6)
- tst.l d0
- bne .dlfound
- moveq #0,d0
- lea (_nodev),a0
- lea (_getdevinfo),a1
- bsr _PrintError
- moveq #0,d7
- bra .unlockdl
- .dlfound
- move.l d0,a0 ;A0 = APTR DosList
- tst.l (dol_Task,a0)
- beq .notask
- move.l (dol_Startup,a0),d0
- cmp.l #64,d0 ; $00000040 < d6 < $80000000 ?? BPTR!
- blt .badstartup
- add.l d0,d0
- add.l d0,d0
- beq .nostartup
- move.l d0,a0 ;A0 = APTR FileSystemStartupMessage
-
- tst.l (fssm_Device,a0)
- beq .nodevice
- move.l a0,-(a7)
- move.l (fssm_Device,a0),a0 ;a BSTR !!!
- add.l a0,a0
- add.l a0,a0 ;now it's a APTR
- moveq #0,d0
- move.b (a0)+,d0
- addq.l #1,d0 ;d0 size of needed space (length+1)
- moveq #DEVNAMELEN,d1
- cmp.l d0,d1 ;buffer large enough ?
- bhs .sizeok
- addq.l #4,a7 ;correct stack
- bra .copyerr
- .sizeok lea (devi_Device,a2),a1
- bsr _CopyString
- move.l (a7)+,a0
-
- move.l (fssm_Unit,a0),(devi_Unit,a2)
- move.l (fssm_Flags,a0),(devi_DeviceFlags,a2)
- move.l (fssm_Environ,a0),d0
- add.l d0,d0
- add.l d0,d0
- beq .noenvec
-
- move.l d0,a0 ;A0 = APTR DosEnvec
- move.l (de_SizeBlock,a0),d0
- lsl.l #2,d0 ;size in Bytes
- move.l d0,(devi_SizeBlock,a2)
- move.l (de_Surfaces,a0),(devi_Surfaces,a2)
- move.l (de_SectorPerBlock,a0),(devi_SectorPerBlock,a2)
- move.l (de_BlocksPerTrack,a0),(devi_BlocksPerTrack,a2)
- move.l (de_LowCyl,a0),(devi_LowCyl,a2)
- move.l (de_HighCyl,a0),(devi_HighCyl,a2)
- bra .unlockdl
- .notask
- .badstartup
- .nostartup
- .nodevice
- .copyerr
- .noenvec moveq #0,d0
- lea (_baddev),a0
- lea (_getdevinfo),a1
- bsr _PrintError
- moveq #0,d7
- .unlockdl
- moveq #DOSLISTFLAGS,d1
- jsr (_LVOUnLockDosList,a6)
- .nodl
- move.l d7,d0
- movem.l (a7)+,d2-d7/a2/a6
- rts
- ENDC
- ENDM
-
- ;----------------------------------------
- ; error strings for device operations
- ; for using with "Sources:strings.i" _DoString
-
- deviceerrors MACRO
- IFND DEVICEERRORS
- DEVICEERRORS = 1
-
- _deviceerrors
- .base dc.w -7 ;min index
- dc.w -1 ;max index
- dc.l 0 ;next list
- dc.w .7-.base
- dc.w .6-.base
- dc.w .5-.base
- dc.w .4-.base
- dc.w .3-.base
- dc.w .2-.base
- dc.w .1-.base
- .7 dc.b "hardware failed selftest",0
- .6 dc.b "unit is busy",0
- .5 dc.b "invalid address (IO_DATA)",0
- .4 dc.b "invalid length (IO_LENGTH/IO_OFFSET)",0
- .3 dc.b "unsupported device CMD",0
- .2 dc.b "AbortIO()",0
- .1 dc.b "open device failed",0
- EVEN
- ENDC
- ENDM
-
- ;----------------------------------------
- ; error strings for trackdisk.device operations
- ; for using with "Sources:strings.i" _DoString
-
- trackdiskerrors MACRO
- IFND TRACKDISKERRORS
- TRACKDISKERRORS = 1
- IFND DEVICEERRORS
- deviceerrors
- ENDC
-
- _trackdiskerrors
- .base dc.w 20
- dc.w 50
- dc.l _deviceerrors
- dc.w .20-.base
- dc.w .21-.base
- dc.w .22-.base
- dc.w .23-.base
- dc.w .24-.base
- dc.w .25-.base
- dc.w .26-.base
- dc.w .27-.base
- dc.w .28-.base
- dc.w .29-.base
- dc.w .30-.base
- dc.w .31-.base
- dc.w .32-.base
- dc.w .33-.base
- dc.w .34-.base
- dc.w .35-.base
- dc.w .36-.base
- dc.w .37-.base
- dc.w 0
- dc.w 0
- dc.w 0
- dc.w 0
- dc.w .42-.base
- dc.w 0
- dc.w 0
- dc.w 0
- dc.w 0
- dc.w 0
- dc.w 0
- dc.w 0
- dc.w .50-.base
- .20 dc.b "not specified",0
- .21 dc.b "no sector header",0
- .22 dc.b "bad sector preamble",0
- .23 dc.b "bad sector id",0
- .24 dc.b "bad header chksum",0
- .25 dc.b "bad sector chksum",0
- .26 dc.b "too few sectors",0
- .27 dc.b "bad sector header",0
- .28 dc.b "write protected",0
- .29 dc.b "no disk in drive",0
- .30 dc.b "couldn't find track 0",0
- .31 dc.b "not enough memory",0
- .32 dc.b "bad unit number",0
- .33 dc.b "bad drive type",0
- .34 dc.b "drive in use",0
- .35 dc.b "post reset",0
- .36 dc.b "data on disk is wrong type",0
- .37 dc.b "invalid CMD under current conditions",0
- .42 dc.b "illegal/unexpected SCSI phase",0
- .50 dc.b "nonexistent board",0
- EVEN
- ENDC
- ENDM
-
- ;---------------------------------------------------------------------------
-
- ENDC
-
-